#pragma once

#include "strategy/strategy.h"
#include "strategy/market_making_strategy.h"
#include "strategy/optimized_mean_reversion_strategy.h"
#include "strategy/optimized_trend_following_strategy.h"
#include "strategy/optimized_statistical_arbitrage_strategy.h"
#include <memory>
#include <string>
#include <unordered_map>

namespace hft {

/**
 * @brief 策略工厂类，用于创建各种交易策略
 * 
 * 这个工厂类支持创建原始版本和优化版本的策略。
 * 优化版本使用RingBuffer进行高效的价格历史管理，
 * 适合高频交易场景。
 */
class StrategyFactory {
public:
    /**
     * @brief 创建策略实例
     * 
     * @param type 策略类型
     * @param config 策略配置
     * @param use_optimized 是否使用优化版本
     * @return std::shared_ptr<Strategy> 策略实例
     */
    static std::shared_ptr<Strategy> createStrategy(
        const std::string& type,
        const std::string& config,
        bool use_optimized = true
    ) {
        std::shared_ptr<Strategy> strategy;

        if (type == "MarketMaking") {
            strategy = std::make_shared<MarketMakingStrategy>();
        }
        else if (type == "MeanReversion") {
            if (use_optimized) {
                // 解析配置
                std::string symbol = "DEFAULT";
                size_t lookback_period = 100;
                double entry_threshold = 2.0;
                double exit_threshold = 0.5;
                
                // 实际应用中应该从config字符串解析参数
                // parseConfig(config, symbol, lookback_period, entry_threshold, exit_threshold);
                
                strategy = std::make_shared<OptimizedMeanReversionStrategy>(
                    symbol, lookback_period, entry_threshold, exit_threshold);
            }
            else {
                // 创建原始版本的均值回归策略
                strategy = std::make_shared<MeanReversionStrategy>();
            }
        }
        else if (type == "TrendFollowing") {
            if (use_optimized) {
                // 解析配置
                std::string symbol = "DEFAULT";
                size_t short_period = 10;
                size_t long_period = 30;
                double trend_threshold = 0.001;
                
                // 实际应用中应该从config字符串解析参数
                // parseConfig(config, symbol, short_period, long_period, trend_threshold);
                
                strategy = std::make_shared<OptimizedTrendFollowingStrategy>(
                    symbol, short_period, long_period, trend_threshold);
            }
            else {
                // 创建原始版本的趋势跟踪策略
                strategy = std::make_shared<TrendFollowingStrategy>();
            }
        }
        else if (type == "StatisticalArbitrage") {
            if (use_optimized) {
                // 解析配置
                std::string symbol1 = "DEFAULT1";
                std::string symbol2 = "DEFAULT2";
                size_t lookback_period = 100;
                double entry_threshold = 2.0;
                double exit_threshold = 0.5;
                
                // 实际应用中应该从config字符串解析参数
                // parseConfig(config, symbol1, symbol2, lookback_period, entry_threshold, exit_threshold);
                
                strategy = std::make_shared<OptimizedStatisticalArbitrageStrategy>(
                    symbol1, symbol2, lookback_period, entry_threshold, exit_threshold);
            }
            else {
                // 创建原始版本的统计套利策略
                strategy = std::make_shared<StatisticalArbitrageStrategy>();
            }
        }
        else {
            // 未知策略类型
            return nullptr;
        }

        // 初始化策略
        if (strategy) {
            strategy->init(config);
        }

        return strategy;
    }

private:
    // 配置解析辅助函数
    // 实际应用中应该实现这些函数来解析JSON或其他格式的配置
    
    // 解析均值回归策略配置
    static void parseConfig(
        const std::string& config,
        std::string& symbol,
        size_t& lookback_period,
        double& entry_threshold,
        double& exit_threshold
    ) {
        // 解析配置字符串，例如JSON格式
        // 这里只是示例，实际应用中应该使用JSON库
    }
    
    // 解析趋势跟踪策略配置
    static void parseConfig(
        const std::string& config,
        std::string& symbol,
        size_t& short_period,
        size_t& long_period,
        double& trend_threshold
    ) {
        // 解析配置字符串
    }
    
    // 解析统计套利策略配置
    static void parseConfig(
        const std::string& config,
        std::string& symbol1,
        std::string& symbol2,
        size_t& lookback_period,
        double& entry_threshold,
        double& exit_threshold
    ) {
        // 解析配置字符串
    }
};

} // namespace hft